﻿//МЛДЕЛЬ ДОКУМЕНТА
var docModel = null;

//КОНТЕКСТНОЕ МЕНЮ
var tdMenu = null;

//ТИП ЯЧЕЕК ПО УМОЛЧАНИЮ
var CurrentCellMode = 'clMNN';

//ВЫВОД СООБЩЕНИЯ ПРИ РАБОТЕ С СЕРВЕРОМ
var loadText = 'Loading... Please wait';
function showLoadingMask(loadingMessage) {
    if (Ext.isEmpty(loadingMessage))
        loadText = 'Loading... Please wait';    
    Ext.Ajax.on('beforerequest', function () { Ext.getBody().mask(loadText, 'loading') }, Ext.getBody());
    Ext.Ajax.on('requestcomplete', Ext.getBody().unmask, Ext.getBody());
    Ext.Ajax.on('requestexception', Ext.getBody().unmask, Ext.getBody());
}




///////////////////////////////////////////////////////////////Main()///////////////////////////////////////////////////////////////
function Main() {
    //тайм аут на запросы
    Ext.Ajax.timeout = 250000;      
    
    //прописать loading
    showLoadingMask(); 

    //убрать контекстное меню браузера
    Ext.getBody().on("contextmenu", Ext.emptyFn, null, { preventDefault: true });

    //прописать сохранение по закрытию окна
    window.onunload = DocumentEventHandlers.onBeforeUnload;    

    //в глобальной переменной сформировать модель документа
    docModel = new Class.DocumentModel();

    //сформировать переменную являющуюся контекстным меню
    tdMenu = new TContextMenuTD();
        
    //Прописать таблички в модели документа прописать контекстное меню
    var tables = Ext.select('Table');
    for (var i = 0; i < tables.elements.length; i++) {
        docModel.tables.push(new Class.DocumentTable(tables.elements[i]));
        //SetContextMenu(tables.elements[i]);
    }

    //выставить горячие клавиши 
    Ext.getBody().on("keypress",DocumentEventHandlers.onHotKeysPress);
   
   
   //прокрутить документ к строке с последним ключевым словом
    var v = { x: 700, y: 30 };
    var lw = Ext.get(lastKeyWordID);
    if (lw) {
        v = getAbsolutePosition(lw.dom);
        window.scrollBy(v.x, v.y);
    }

}

//ОБРАБОТЧИК СОБЫТИЙ редактора
var TdTableEventHandler={
    //кнопкой по ячейке
    CellClick: function (cellID) {
        this.Cell2Model(cellID); 
    },
    //
    Cell2Model:function (cellID){
    //alert(cellID);
    var el = Ext.get(cellID);
    if (window.event.ctrlKey) {
        //снять значение ячейки 
        docModel.removeCell(CurrentCellMode, el);
        if (el) CellTypeEnum.clearCss(el);
    }
    else {
        //проставить значение в модели
        var arrKeys = [];
        docModel.addCell(CurrentCellMode, el);
        //визуализировать изменение
        var css = CellTypeEnum.getCssName(CurrentCellMode);

        if (el) {
            CellTypeEnum.clearCss(el);
            el.addCls(css);
        };
    }
},
    
    RemoveCellFromModel:function (cellID) {
    var el = Ext.get(cellID);
    if (el) {docModel.removeCell(CurrentCellMode, el);
            CellTypeEnum.clearCss(el);}
    },

    // правая кнопка мыши по ячейке
    ContextClick:function (cellID) {
    var td = Ext.get(cellID);
    currentXY =td.getXY();    
    tdMenu.args = cellID;
    tdMenu.showAt(currentXY);
    },

    OnmouseOver:function (cellID) {
    var el = Ext.get(cellID);
    if (window.event.ctrlKey) {this.CellClick (cellID);}
}

};

var DocumentEventHandlers = {
    // горячие клавиши 
     onHotKeysPress: function (e) {
    var p = null;
    if (e.keyCode == null)
        p = e;
    else
        p = e.keyCode;

    //сменить режим выбора ячейки
    var cngCurrentCellMode = function (cellModeId) {
        CurrentCellMode = cellModeId;
    };


    //Выставляем тип считываемой ячейки
    if (p == 49)
        cngCurrentCellMode(CellTypeEnum.clMNN);

    if (p == 50)
        cngCurrentCellMode(CellTypeEnum.clInfo);

    if (p == 51)
        cngCurrentCellMode(CellTypeEnum.clIzm);

    if (p == 52)
        cngCurrentCellMode(CellTypeEnum.clCount);

    if (p == 53)
        cngCurrentCellMode(CellTypeEnum.clPrice);

},
    //СОХРАНЕИЕ ПО ЗАКРЫТИЮ
    onBeforeUnload:function() {docModel.saveToDb();}
};


var MenuEventHandlers = {
    //Контекстное меню
    mnuItemClick: function (itm) {
        var p = docModel.parseID(itm.ownerCt.args);
        var tbl = docModel.getDocumentTable(p.TableNN);
        //Установить режим 
        CurrentCellMode = CellTypeEnum.getModeByName(itm.id);
        //Считать столбец    
        MenuEventHandlers.mnuItemReadColumn(itm.ownerCt.args);
    },

    //ClearColumn
    mnuItemClearColumn: function (itm) {
        var p = docModel.parseID(itm.ownerCt.args);
        var tbl = docModel.getDocumentTable(p.TableNN);
        var tdMaxCount = tbl.tbl.rows[p.RowID].cells.length;
        for (var i = p.RowNN - 1; i < tbl.tbl.rows.length; i++) {
            parseRow(tbl.tbl.rows[i], tdMaxCount, p.TdNN, TdTableEventHandler.RemoveCellFromModel);
        }

    },

    //Show Data Editor
    mnuItemShowRowEditor: function (itm) {
        //пройтись по строчкам документа и собрать набор неопределенных строк
        docModel.PopulateRawRows();
        var v = { RawRows: docModel.DataRows };
        var rr = { Procedure: 'PopulateRawRows', args: v };
        var prr_params = Ext.encode(rr);

        //дернуть сервер вызвав первичное автоматическое определение данных 
        Ext.Ajax.request({
            conn: { timeout: 6000000 },
            url: 'http://' + document.location.host + '/AdministrationPort.ashx',

            //получаем обработанные строчки с сервера и грузим их в хранилище окна редактирования
            success: function (p) {
                var data = Ext.decode(p.responseText);
                if (data['d'] != null)
                    docModel.DataRows = data.d;
                var ww = new documentEditor.window.DocumentRowEditor();
                var r_store = new store.RawRows();
                r_store.loadData(docModel.DataRows);
                ww.add(new administration.grid.rawRows({ store: r_store }));
                ww.show();
            },
            failure: function (p) {
                alert(p.statusText);
            },
            headers: {
                "Content-Type": "application/json; charset=utf-8",
                "Cache-Control": "no-cache"
            },
            params: prr_params
        });
    },

    mnuItemReadColumn: function (cellID) {
    try {
        var p = docModel.parseID(cellID);
        var tbl = docModel.getDocumentTable(p.TableNN);
        var tdMaxCount = tbl.tbl.rows[p.RowID].cells.length;

        for (var i = p.RowNN - 1; i < tbl.tbl.rows.length; i++) {
            parseRow(tbl.tbl.rows[i], tdMaxCount, p.TdNN, callBackOnSelectCell);
        }

        //docModel.saveToDb();
    }
    catch (e) {
        alert("Невозможно считать столбец. Используйте режим ячейка");
    }

}

};


/////////////////////////////////////////////////////////Событие отобрать ячейку///////////////////////////////////////////////////////////

var callBackOnSelectCell = function (cell) {
  TdTableEventHandler.Cell2Model(cell.id);
};

var callBackOnUnSelectCell = function (cell) {
    TdTableEventHandler.Cell2Model(cell.id);    
};


////////////////////////////////////////////////////////////////////Tools/////////////////////////////////////////////////////////////////
/////Прорисовать данные модели в документе
//function LoadDocument() {
//    docModel.LoadData();

var parseRow = function (row, tdCount, tdNN, callback) {
    if (null == row.cells[tdNN])
        return;
    var el = Ext.get(row.cells[tdNN].id);
    if (el) {
        if (callback)
            callback(el);
    }
}


function getAbsolutePosition(el) {
    var r = { x: el.offsetLeft, y: el.offsetTop };
    if (el.offsetParent) {
        var tmp = getAbsolutePosition(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }
    return r;
}

